package org.example.day03;

import java.util.*;

/**
 * @author zlxad
 * @version 1.0
 * @description: TODO+
 * <p>  主管期望你来实现英文输入法单词联想功能。需求如下： </p> <p>  依据用户输入的单词前缀，从已输入的英文语句中联想出用户想输入的单词，按字典序输出联想到的单词序列，如果联想不到，请输出用户输入的单词前缀。 </p> <p>  注意： </p> <p>  1.  英文单词联想时，区分大小写 </p> <p>  2.  缩略形式如”don't”，判定为两个单词，”don”和”t” </p> <p>  3.  输出的单词序列，不能有重复单词，且只能是英文单词，不能有标点符号 </p>
 *
 * 主管期望你来实现英文输入法单词联想功能。需求如下：
 * 依据用户输入的单词前缀，从已输入的英文语句中联想出用户想输入的单词，按字典序输出联想到的单词序列，如果联想不到，请输出用户输入的单词前缀。
 * 注意：
 * 1.  英文单词联想时，区分大小写
 * 2.  缩略形式如”don't”，判定为两个单词，”don”和”t”
 * 3.  输出的单词序列，不能有重复单词，且只能是英文单词，不能有标点符号
 * @date 2024/3/11 15:22
 */
public class test048 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 首行输入一段由英文单词和标点符号组成的语句
        String str = scanner.nextLine();
        // 接下来一行为一个英文单词前缀
        String pre = scanner.nextLine();
        scanner.close();

        // 调用联想单词方法
        List<String> associatedWords = associateWords(str, pre);

        // 如果没有联想到任何单词，则输出单词前缀
        if (associatedWords.isEmpty()) {
            System.out.println(pre);
        } else {
            // 输出联想到的单词序列，单词之间以空格分割
            System.out.println(String.join(" ", associatedWords));
        }
    }

    // 联想单词的方法
    private static List<String> associateWords(String str, String pre) {
        // 使用TreeSet保证单词按字典序排列且不重复
        Set<String> wordSet = new TreeSet<>();

        // 将输入的字符串按非单词字符进行分割
        String[] words = str.split("\\W+");

        // 遍历单词数组
        for (String word : words) {
            // 如果单词以给定的前缀开始，则添加到结果集合中
            if (word.startsWith(pre)) {
                wordSet.add(word);
            }
        }

        // 返回结果集合转换为列表
        return new ArrayList<>(wordSet);
    }
}

